namespace VRTK.Examples { using UnityEngine; using UnityEngine.UI; public class PanelMenuSaucerGrid : MonoBehaviour { public GridLayoutGroup gridLayoutGroup; public MeshRenderer changeObject; public VRTK_PanelMenuItemController panelMenuController; public Color[] colours = new Color[0]; protected int currentIndex = 0; protected readonly Color colorDefault = Color.white; protected readonly Color colorSelected = Color.green; protected readonly float colorAlpha = 0.25f; protected enum Direction { None, Up, Down, Left, Right } protected virtual void OnEnable() { if (panelMenuController != null) { panelMenuController.PanelMenuItemSwipeTop += PanelMenuItemSwipeTop; panelMenuController.PanelMenuItemSwipeBottom += PanelMenuItemSwipeBottom; panelMenuController.PanelMenuItemSwipeLeft += PanelMenuItemSwipeLeft; panelMenuController.PanelMenuItemSwipeRight += PanelMenuItemSwipeRight; panelMenuController.PanelMenuItemTriggerPressed += PanelMenuItemTriggerPressed; } SetGridLayoutItemSelectedState(currentIndex); } protected virtual void PanelMenuItemTriggerPressed(object sender, PanelMenuItemControllerEventArgs e) { if (currentIndex < colours.Length && changeObject != null) { changeObject.material.color = colours[currentIndex]; } } protected virtual void PanelMenuItemSwipeRight(object sender, PanelMenuItemControllerEventArgs e) { MoveSelectGridLayoutItem(Direction.Right); } protected virtual void PanelMenuItemSwipeLeft(object sender, PanelMenuItemControllerEventArgs e) { MoveSelectGridLayoutItem(Direction.Left); } protected virtual void PanelMenuItemSwipeBottom(object sender, PanelMenuItemControllerEventArgs e) { MoveSelectGridLayoutItem(Direction.Down); } protected virtual void PanelMenuItemSwipeTop(object sender, PanelMenuItemControllerEventArgs e) { MoveSelectGridLayoutItem(Direction.Up); } protected virtual void SetGridLayoutItemSelectedState(int index) { foreach (Transform childTransform in gridLayoutGroup.transform) { GameObject child = childTransform.gameObject; if (child != null) { Color color = colorDefault; color.a = colorAlpha; child.GetComponent().color = color; } } Transform selected = gridLayoutGroup.transform.GetChild(index); if (selected != null) { Color color = colorSelected; color.a = colorAlpha; selected.GetComponent().color = color; } } protected virtual bool MoveSelectGridLayoutItem(Direction direction) { int newIndex = FindNextItemBasedOnMoveDirection(direction); if (newIndex != currentIndex) { SetGridLayoutItemSelectedState(newIndex); currentIndex = newIndex; } return true; } protected virtual int FindNextItemBasedOnMoveDirection(Direction direction) { float width = gridLayoutGroup.preferredWidth; float cellWidth = gridLayoutGroup.cellSize.x; float spacing = gridLayoutGroup.spacing.x; int cellsAccross = (int)Mathf.Floor(width / (cellWidth + (spacing / 2))); // quick / dirty int childCount = gridLayoutGroup.transform.childCount; switch (direction) { case Direction.Up: int nextUp = currentIndex - cellsAccross; return (nextUp >= 0) ? nextUp : currentIndex; case Direction.Down: int nextDown = currentIndex + cellsAccross; return (nextDown < childCount) ? nextDown : currentIndex; case Direction.Left: int nextLeft = currentIndex - 1; return (nextLeft >= 0) ? nextLeft : currentIndex; case Direction.Right: int nextRight = currentIndex + 1; return (nextRight < childCount) ? nextRight : currentIndex; default: return currentIndex; } } } }